/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.sorbonne.inf5.yams.vue;

import fr.sorbonne.inf5.yams.controleur.ControleurJeu;
import fr.sorbonne.inf5.yams.model.combinaison.CarreCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.CinqCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.DeuxCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.FullCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.GrandeSuiteCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.InferieurCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.PetiteSuiteCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.QuatreCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.SixCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.SuperieurCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.TroisCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.UnCombinaison;
import fr.sorbonne.inf5.yams.model.combinaison.YamsCombinaison;
import fr.sorbonne.inf5.yams.properties.BundleTool;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * Classe qui se charge de l'affichage
 * des combinaions
 * @author Dubos Romain
 * @author Oukherfellah Riad
 */
public class VueCombinaisons {

    private JPanel panel;
    private JLabel joueurCourant, joueurCourantChaine, nbLancerRestant, nbLancerRestantChaine, combinaison, score1,
            score2, sousScoreLabel1, sousScoreLabel2, sousScoreLabel3, sousScore1, sousScore2, sousScore3, scoreTotal;
    private JButton un, deux, trois, quatre, cinq, six, sup, inf, carre, full, petite, grande, yam;
    private JLabel unLabel, deuxLabel, troisLabel, quatreLabel, cinqLabel, sixLabel, supLabel, infLabel,
            carreLabel, fullLabel, petiteLabel, grandeLabel, yamLabel;
    //NOMS
    public static final String UN = UnCombinaison.intitule;
    public static final String DEUX = DeuxCombinaison.intitule;
    public static final String TROIS = TroisCombinaison.intitule;
    public static final String QUATRE = QuatreCombinaison.intitule;
    public static final String CINQ = CinqCombinaison.intitule;
    public static final String SIX = SixCombinaison.intitule;
    public static final String SUP = SuperieurCombinaison.intitule;
    public static final String INF = InferieurCombinaison.intitule;
    public static final String CARRE = CarreCombinaison.intitule;
    public static final String FULL = FullCombinaison.intitule;
    public static final String PETITE = PetiteSuiteCombinaison.intitule;
    public static final String GRANDE = GrandeSuiteCombinaison.intitule;
    public static final String YAM = YamsCombinaison.intitule;
    private List<JLabel> labelCombi;
    private List<JButton> boutonsCombi;

    /**
     * Constructeur
     */
    public VueCombinaisons() {
        this.panel = new JPanel(new GridLayout(20, 2));

        this.combinaison = new JLabel();
        this.combinaison.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.score1 = new JLabel();
        this.score1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.score2 = new JLabel();
        this.score2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);


        this.un = new JButton();
        this.un.setActionCommand(UN);
        this.deux = new JButton();
        this.deux.setActionCommand(DEUX);
        this.trois = new JButton();
        this.trois.setActionCommand(TROIS);
        this.quatre = new JButton();
        this.quatre.setActionCommand(QUATRE);
        this.cinq = new JButton();
        this.cinq.setActionCommand(CINQ);
        this.six = new JButton();
        this.six.setActionCommand(SIX);
        this.sup = new JButton();
        this.sup.setActionCommand(SUP);
        this.inf = new JButton();
        this.inf.setActionCommand(INF);
        this.carre = new JButton();
        this.carre.setActionCommand(CARRE);
        this.full = new JButton();
        this.full.setActionCommand(FULL);
        this.petite = new JButton();
        this.petite.setActionCommand(PETITE);
        this.grande = new JButton();
        this.grande.setActionCommand(GRANDE);
        this.yam = new JButton();
        this.yam.setActionCommand(YAM);

        this.boutonsCombi = new ArrayList<JButton>();
        this.boutonsCombi.add(un);
        this.boutonsCombi.add(deux);
        this.boutonsCombi.add(trois);
        this.boutonsCombi.add(quatre);
        this.boutonsCombi.add(cinq);
        this.boutonsCombi.add(six);
        this.boutonsCombi.add(sup);
        this.boutonsCombi.add(inf);
        this.boutonsCombi.add(carre);
        this.boutonsCombi.add(full);
        this.boutonsCombi.add(petite);
        this.boutonsCombi.add(grande);
        this.boutonsCombi.add(yam);

        this.unLabel = new JLabel();
        this.unLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.deuxLabel = new JLabel();
        this.deuxLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.troisLabel = new JLabel();
        this.troisLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.quatreLabel = new JLabel();
        this.quatreLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.cinqLabel = new JLabel();
        this.cinqLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.sixLabel = new JLabel();
        this.sixLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.supLabel = new JLabel();
        this.supLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.infLabel = new JLabel();
        this.infLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.carreLabel = new JLabel();
        this.carreLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.fullLabel = new JLabel();
        this.fullLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.petiteLabel = new JLabel();
        this.petiteLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.grandeLabel = new JLabel();
        this.grandeLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.yamLabel = new JLabel();
        this.yamLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);

        this.labelCombi = new ArrayList<JLabel>();
        this.labelCombi.add(unLabel);
        this.labelCombi.add(deuxLabel);
        this.labelCombi.add(troisLabel);
        this.labelCombi.add(quatreLabel);
        this.labelCombi.add(cinqLabel);
        this.labelCombi.add(sixLabel);
        this.labelCombi.add(supLabel);
        this.labelCombi.add(infLabel);
        this.labelCombi.add(carreLabel);
        this.labelCombi.add(fullLabel);
        this.labelCombi.add(petiteLabel);
        this.labelCombi.add(grandeLabel);
        this.labelCombi.add(yamLabel);

        this.joueurCourant = new JLabel();
        this.joueurCourant.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        this.joueurCourantChaine = new JLabel();
        this.joueurCourantChaine.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        this.nbLancerRestant = new JLabel();
        this.nbLancerRestant.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        this.nbLancerRestantChaine = new JLabel();
        this.nbLancerRestantChaine.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        this.sousScoreLabel1 = new JLabel();
        this.sousScoreLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.sousScoreLabel2 = new JLabel();
        this.sousScoreLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.sousScoreLabel3 = new JLabel();
        this.sousScoreLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.sousScore1 = new JLabel();
        this.sousScore1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.sousScore2 = new JLabel();
        this.sousScore2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.sousScore3 = new JLabel();
        this.sousScore3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        this.scoreTotal = new JLabel();
        this.scoreTotal.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);

        this.panel.add(nbLancerRestantChaine);
        this.panel.add(nbLancerRestant);
        this.panel.add(joueurCourantChaine);
        this.panel.add(joueurCourant);
        this.panel.add(combinaison);
        this.panel.add(score1);
        this.panel.add(un);
        this.panel.add(unLabel);
        this.panel.add(deux);
        this.panel.add(deuxLabel);
        this.panel.add(trois);
        this.panel.add(troisLabel);
        this.panel.add(quatre);
        this.panel.add(quatreLabel);
        this.panel.add(cinq);
        this.panel.add(cinqLabel);
        this.panel.add(six);
        this.panel.add(sixLabel);
        this.panel.add(sousScoreLabel1);
        this.panel.add(sousScore1);
        this.panel.add(sup);
        this.panel.add(supLabel);
        this.panel.add(inf);
        this.panel.add(infLabel);
        this.panel.add(sousScoreLabel2);
        this.panel.add(sousScore2);
        this.panel.add(carre);
        this.panel.add(carreLabel);
        this.panel.add(full);
        this.panel.add(fullLabel);
        this.panel.add(petite);
        this.panel.add(petiteLabel);
        this.panel.add(grande);
        this.panel.add(grandeLabel);
        this.panel.add(yam);
        this.panel.add(yamLabel);
        this.panel.add(sousScoreLabel3);
        this.panel.add(sousScore3);
        this.panel.add(score2);
        this.panel.add(scoreTotal);

        this.panel.setBackground(Color.WHITE);

        this.nommerComposants();
        this.initStringLabel();
    }

    /**
     * Permet de nommer l'ensemble des coposants
     * et titre de l'application
     */
    public final void nommerComposants() {

        this.joueurCourantChaine.setText(BundleTool.getBundle().getString("joueurCourant") + " ");
        this.nbLancerRestantChaine.setText(BundleTool.getBundle().getString("nbLancer") + " ");
        this.score1.setText(BundleTool.getBundle().getString("score"));
        this.score2.setText(BundleTool.getBundle().getString("score"));
        this.sousScoreLabel1.setText(BundleTool.getBundle().getString("sousScore"));
        this.sousScoreLabel2.setText(BundleTool.getBundle().getString("sousScore"));
        this.sousScoreLabel3.setText(BundleTool.getBundle().getString("sousScore"));
        this.combinaison.setText(BundleTool.getBundle().getString("combinaison"));

        this.un.setText(BundleTool.getBundle().getString("UN"));
        this.deux.setText(BundleTool.getBundle().getString("DEUX"));
        this.trois.setText(BundleTool.getBundle().getString("TROIS"));        
        this.quatre.setText(BundleTool.getBundle().getString("QUATRE"));
        this.cinq.setText(BundleTool.getBundle().getString("CINQ"));
        this.six.setText(BundleTool.getBundle().getString("SIX"));
        this.sup.setText(BundleTool.getBundle().getString("SUP"));
        this.inf.setText(BundleTool.getBundle().getString("INF"));
        this.carre.setText(BundleTool.getBundle().getString("CARRE"));
        this.full.setText(BundleTool.getBundle().getString("FULL"));
        this.petite.setText(BundleTool.getBundle().getString("PETITE"));
        this.grande.setText(BundleTool.getBundle().getString("GRANDE"));
        this.yam.setText(BundleTool.getBundle().getString("YAM"));
    }

    /**
     * Remet à 0 les labels de combinaisons
     */
    public final void initStringLabel() {
        
        this.unLabel.setText("0");
        this.deuxLabel.setText("0");
        this.troisLabel.setText("0");
        this.quatreLabel.setText("0");
        this.cinqLabel.setText("0");
        this.sixLabel.setText("0");
        this.supLabel.setText("0");
        this.infLabel.setText("0");
        this.carreLabel.setText("0");
        this.fullLabel.setText("0");
        this.petiteLabel.setText("0");
        this.grandeLabel.setText("0");
        this.yamLabel.setText("0");
        this.scoreTotal.setText("0");
        this.sousScore1.setText("0");
        this.sousScore2.setText("0");
        this.sousScore3.setText("0");
        this.nbLancerRestant.setText("-");

    }

    /**
     * Abonne les combinaisons au controleur
     * @param ctrl controleur du jeu
     */
    public void abonnement(ControleurJeu ctrl) {
        this.un.addActionListener(ctrl);
        this.deux.addActionListener(ctrl);
        this.trois.addActionListener(ctrl);
        this.quatre.addActionListener(ctrl);
        this.cinq.addActionListener(ctrl);
        this.six.addActionListener(ctrl);
        this.sup.addActionListener(ctrl);
        this.inf.addActionListener(ctrl);
        this.carre.addActionListener(ctrl);
        this.full.addActionListener(ctrl);
        this.petite.addActionListener(ctrl);
        this.grande.addActionListener(ctrl);
        this.yam.addActionListener(ctrl);
    }

    /**
     * Permet de rendre inutilisable les boutons
     * des combinaisons
     */
    public void griserVue() {
        Component[] composants = this.panel.getComponents();
        for (int i = 0; i < composants.length; i++) {
            if (composants[i] instanceof JButton) {
                composants[i].setEnabled(false);
            }
        }
    }

    /**
     * Permet de rendre utilisable les boutons
     * des combinaisons
     */
    public void deGriserVue() {
        Component[] composants = this.panel.getComponents();
        for (int i = 0; i < composants.length; i++) {
            if (composants[i] instanceof JButton) {
                composants[i].setEnabled(true);
            }
        }
    }

    /**
     * Permet de rendre inutilisable les boutons
     * des combinaisons validées
     */
    public void griserCombisValides(List<Boolean> valide) {
        Component[] components = this.panel.getComponents();
        List<JButton> combis = new ArrayList<JButton>();
        for (int i = 0; i < components.length; i++) {
            if (components[i] instanceof JButton) {
                combis.add((JButton) components[i]);
            }
        }

        for (int i = 0; i < combis.size(); i++) {
            combis.get(i).setEnabled(valide.get(i));
        }

    }

    /**
     * Renvoie le panel contenant les combinaisons
     * @return JPanel
     */
    public JPanel getPanel() {
        return this.panel;
    }

    /**
     * Charge les previsions des combi non validées
     * @param prev liste de prevision
     */
    public void chargerPrevison(List<String> prev) {
        for (int i = 0; i < this.labelCombi.size(); i++) {
            if (this.boutonsCombi.get(i).isEnabled()) {
                labelCombi.get(i).setText(prev.get(i));
            }
        }
    }

    /**
     * Charge les scores des combi validées
     * @param prev liste de score
     */
    public void chargerNumValidationPrec(Object[] score) {
        for (int i = 0; i < this.labelCombi.size(); i++) {
            if (!this.boutonsCombi.get(i).isEnabled()) {
                labelCombi.get(i).setText(String.valueOf(score[i]));
            } else {
                labelCombi.get(i).setText("0");
            }
        }
    }

    /**
     * Charge les differents score et sous score
     * et re initialise le nombre de lancer restant
     */
    public void chargerScores(String pScoreTotal, String sousScore1, String sousScore2, String sousScore3) {
        this.scoreTotal.setText(pScoreTotal);
        this.sousScore1.setText(sousScore1);
        this.sousScore2.setText(sousScore2);
        this.sousScore3.setText(sousScore3);

        this.nbLancerRestant.setText("-");
    }

    /**
     * Affiche le joueur courant
     * @param joueur joueur courant
     */
    public void changeJoueurCourant(String pJoueur) {
        this.joueurCourant.setText(pJoueur);
    }

    /**
     * Change le nombre de lancer restant
     * @param pNbLancer nombre de lancer
     */
    public void changeNombreLancer(String pNbLancer) {
        this.nbLancerRestant.setText(pNbLancer);
    }
}
